package com.zwps.common.tool;

import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.util.CollectionUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;


public class CronUtils {
    // 每天
    private static final int DAY_JOB_TYPE = 0;
    // 每周
    private static final int WEEK_JOB_TYPE = 1;
    // 每月
    private static final int MONTH_JOB_TYPE = 2;

    /**
     * 构建任务表达式
     *
     * @param jobType        作业类型: 1/每天; 2/每周;
     * @param second         指定秒钟
     * @param minute         指定分钟
     * @param hour           指定小时
     * @param years          指定年份
     * @param months         指定月份
     * @param weekDays       指定一周哪几天
     *                       周一：Mon
     *                       周二：Tue
     *                       周三：Wed
     *                       周四：Thu
     *                       周五：Fri
     *                       周六：Sat
     *                       周日：Sun
     * @param monthDays      指定一个月的哪几天
     * @return
     */
    public static String createCronExpression(Integer jobType,Integer second, Integer minute, Integer hour,  List<String> years, List<String> months,  List<String> weekDays, List<String> monthDays) {
        StringBuilder cronExp = new StringBuilder();
        // 秒
        cronExp.append(second==null? "0":second).append(" ");
        // 指定分钟，为空则默认0分
        cronExp.append(minute == null ? "0" : minute).append(" ");
        // 指定小时，为空则默认0时
        cronExp.append(hour == null ? "0" : hour).append(" ");
        /**
         每天
         */
        if (jobType == DAY_JOB_TYPE) {
            // 日
            cronExp.append("* ");
            // 月
            cronExp.append("* ");
            // 周
            cronExp.append("?");
        }
        // 按每周
        else if (jobType == WEEK_JOB_TYPE) {
            // 日
            cronExp.append("? ");
            // 月
            if (!CollectionUtils.isEmpty(months)){
                cronExp.append(months.stream()
                        .collect(Collectors.joining(","))).append(" ");
            }else {
                cronExp.append(" * ");
            }

            if (!CollectionUtils.isEmpty(weekDays)){
                // 一个周的哪几天
                cronExp.append(weekDays.stream()
                        .collect(Collectors.joining(","))).append(" ");
            }else {
                cronExp.append(" *");
            }
        }
        // 按每月
        else if ( jobType == MONTH_JOB_TYPE) {// 日
            if (!CollectionUtils.isEmpty(monthDays)&&CollectionUtils.isEmpty(weekDays)) {
                cronExp.append(monthDays.stream()
                        .collect(Collectors.joining(","))).append(" ");
            }else {
                cronExp.append("* ");
            }

            if (!CollectionUtils.isEmpty(months)){
                cronExp.append(months.stream()
                        .collect(Collectors.joining(","))).append(" ?");
            }else {
                cronExp.append(" * ? ");
            }

        }
        //指定年份
        /*if (!CollectionUtils.isEmpty(years)) {
            cronExp.append(" ").append(years.stream()
                    .collect(Collectors.joining(",")));
        }else {
            cronExp.append("* ");
        }*/
        return cronExp.toString();
    }

    public static void main(String[] args) throws ParseException {
        String cronExpression = CronUtils.createCronExpression
                (1,58,2,3,
                        Arrays.asList("2023"),
                        Arrays.asList("9","10"),
                        Arrays.asList("1"),
//                        null,
                        Arrays.asList("1"));
        getExecute(cronExpression);
        System.out.println(cronExpression);
    }

    /**
     * 获取最近10次执行时间
     * @param cronExpression
     * @throws ParseException
     */
    public static List<String> getExecute(String cronExpression) throws ParseException {
        List<String> list = new ArrayList<>();
        CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
        cronTriggerImpl.setCronExpression(cronExpression);
        List<Date> dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 10);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (Date date : dates) {
            list.add(dateFormat.format(date));
            System.out.println(dateFormat.format(date));
        }
        return list;
    }

}


